package com.example.armmvvm.ui.customdraw.view

import android.content.Context
import android.graphics.*
import android.graphics.Paint.ANTI_ALIAS_FLAG
import android.util.AttributeSet
import android.view.View
import com.example.arm.ext.dp
import com.example.arm.ext.dpInt

/**
 * PorterDuffXfermode的使用
 * 注:要使用离屏缓冲:不直接绘制,先绘制到缓存上然后再加载
 *      方法一:canvas.saveLayer(rectF, null),不推荐
 *      方法二:View.setLayerType(LAYER_TYPE_HARDWARE, paint)
 *
 * @author 创建人 ：yanghaozhang
 * @version 1.0
 * @package 包名 ：com.example.armmvvm.ui.main
 * @createTime 创建时间 ：2021/9/13
 * @modifyBy 修改人 ：
 * @modifyTime 修改时间 ：
 * @modifyMemo 修改备注：
 */
class TransfermodeTestView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {

    private val paint = Paint(ANTI_ALIAS_FLAG)

    private val rectF = RectF(0f, 0f, 200.dp, 200.dp)

    private val porterDuffXfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
    val rectBitmap = Bitmap.createBitmap(200.dpInt, 200.dpInt, Bitmap.Config.ARGB_8888)
    val ovalBitmap = Bitmap.createBitmap(200.dpInt, 200.dpInt, Bitmap.Config.ARGB_8888)

    init {
        // 方法二:在View层次上,开启View的离屏缓冲
        // 使用硬件绘制实现离屏缓冲
        setLayerType(LAYER_TYPE_HARDWARE, paint)
        // 使用软件绘制实现离屏缓冲
        // 注:变相实现关闭View的硬件加速,也是针对View唯一的关闭硬件加速方法
        // setLayerType(LAYER_TYPE_SOFTWARE, paint)
        // 关闭离屏缓冲
//        setLayerType(LAYER_TYPE_NONE, paint)
        val canvas = Canvas(rectBitmap)
        paint.color = Color.RED
        canvas.drawRect(50.dp, 50.dp, 100.dp, 100.dp, paint)
        canvas.setBitmap(ovalBitmap)
        paint.color = Color.YELLOW
        canvas.drawOval(75.dp, 75.dp, 125.dp, 125.dp, paint)
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        // 方法一:离屏缓冲
//        val save = canvas.saveLayer(rectF, null)
        paint.color = Color.RED
        canvas.drawRect(50.dp, 50.dp, 100.dp, 100.dp, paint)
        // 注意,这里需要非常注意xfermode的概念,是将前后绘制重叠部分画布的内容进行处理
        // 如果前后绘制画布是部分重叠,比如下面的drawOval,那么未重叠的部分会不予处理
        paint.xfermode = porterDuffXfermode
        paint.color = Color.YELLOW
//        canvas.drawOval(75.dp, 75.dp, 125.dp, 125.dp, paint)
        canvas.drawBitmap(ovalBitmap, 0f, 0f, paint)
        paint.xfermode = null
//        canvas.restoreToCount(save)
    }
}